「计网」06-应用层
Chapter6 - 应用层
本章最重要的内容是:
- 域名系统DNS——从域名解析出IP地址。
- 万维网和HTTP协议。
- 电子邮件的传送过程,SMTP协议和POP3协议、IMAP协议使用的场合。
- 系统调用和应用编程接口的基本概念。
6.1 系统调用和应用编程接口
一、系统调用
- 大多数操作系统使用 系统调用(system call) 的机制在应用程序和操作之间传递控制权。
- 当某个应用进程启动系统调用时,控制权就从应用进程传递给了系统调用接口;
- 此接口再把控制权传递给操作系统;
- 操作系统把这个调用转给某个内部过程,并执行锁清秋的操作;
- 内部过程一旦执行完毕,控制权就又通过系统调用接口返回给应用进程。
- 因此,系统调用接口实际上就是应用进程的控制权和操作系统的控制权进行转换的一个接口,这种系统调用接口又称为应用编程接口(API — Application Programming Interface)。
二、套接字编程接口
- 套接字(socket)是最常用的应用层编程接口
- 名称起源于Berkeley UNIX操作系统
- 经典的socket编程接口采用同步调用方式(又称阻塞式)
- 例:调用recv()时,调用进程将被阻塞,直到收到数据为止
- Windows这种基于事件驱动的系统中,程序的执行由事件驱动,需要异步事件驱动方式的套接字编程接口
- Microsoft推出WinSock编程接口,在阻塞式调用基础上,增加了异步调用方式
- 在阻塞式调用模式下,WinSock与经典的socket兼容
6.2 域名系统 DNS
一、域名系统概述
- 域名系统DNS(Domain Name System)是Internet使用的命名系统
- Internet采用层次结构的命名树作为主机的名字,并使用分布式的域名系统DNS。多个域名服务器上运行专门的域名服务器程序,完成域名到IP地址的解析(resolve)。
- DNS基于UDP协议实现
- 应用进程需要进行域名解析时,就调用域名**解析程序(resolver)**,并成为DNS的一个客户
- 向本地域名服务器发送域名解析请求(UDP报文),其中包含待解析的域名
- 本地域名服务器在查找域名后,返回应答报文,其中包含对应的IP地址
二、Internet的域名结构
- Internet采用层次结构的命名方法
- 任何一个连接在互联网上的主机或路由器,都有一个唯一的层次结构的名字,即域名(domain name)。
- 从语法上讲,每个域名都由标号(label)序列组成,而各标号之间用点隔开,如下:
- 顶级域名TLD(Top Level Domain)
- 国家顶级域名 nTLD:
- 如: .cn 表示中国,.us 表示美国,.uk 表示英国,等等
- 通用顶级域名 gTLD:
- 如下:
- 国家顶级域名 nTLD:
注意:
- 域名不区分大小写
- 域名长度不超过255字符
Internet的域名空间
三、域名服务器
域名服务器分为四类
- 根域名服务器
- 根域名服务器知道所有的顶级域名服务器的域名和IP地址
- 当本地域名服务器无法解析域名时,就求助于根域名服务器
- 顶级域名服务器
- 负责管理在该顶级域名服务器注册的所有二级域名
- 权限域名服务器
- 负责一个**区(zone)**的域名服务器
- 本地域名服务器
- 有时也称为默认域名服务器
- 根域名服务器
域名服务器定期把数据复制到几个域名服务器来保存,其中的一个是主域名服务器,其他的是辅助域名服务器。
树状结构的DNS域名服务器
域名的解析过程
(1)递归查询
- 主机向本地域名服务器的查询一般采用递归查询
- 如果本地域名服务器不知道被查询域名的IP地址,那么它就以DNS客户的身份,向根域名服务器继续发出查询请求报文
- 因此,递归查询返回的结果,要么是查询的IP地址,要么是报错,表示无法查询到所需的IP地址
(2)迭代查询
- 本地域名服务器向根域名服务器的查询通常是采用迭代查询
- 当根域名服务器收到本地域名服务器的迭代查询请求报文时
- 要么给出所要查询的 IP 地址
- 要么告诉本地域名服务器下一步应向哪一个域名服务器查询
- 本地域名服务器进行后续的查询
- 当根域名服务器收到本地域名服务器的迭代查询请求报文时
6.3 文件传送协议
RFC 959:File Transfer Protocol (FTP)
FTP使用客户/服务器方式
- 一个FTP服务器进程可同时为多个客户进程提供服务
- FTP的服务器进程由两大部分组成
- 一个主进程,负责接受新的请求
- 若干个从属进程,负责处理单个请求
- 主进程与从属进程的处理是并发地进行
主进程的工作步骤
- 打开熟知端口(端口号为21),使客户进程能够连接上
- 等待客户进程发出连接请求
- 启动从属进程处理客户进程发来的请求
- 从属进程对客户进程的请求处理完毕后即终止
- 从属进程在运行期间根据需要还可能创建其他一些子进程
- 回到等待状态,继续接受其他客户进程发来的请求
- 在进行文件传输时,FTP的客户和服务器之间要建立两个并行的TCP连接:控制连接和数据连接
- 控制连接
- 在整个会话期间一直保持打开
- FTP客户发出的传送请求通过控制连接发送给服务器端的控制进程,但控制连接不用来传送文件
- 数据连接
- 收到FTP客户发送来的文件传输请求后,服务器端的控制进程创建“数据传送进程”和“数据连接”
- 数据传送进程实际完成文件的传送,传送完毕后关闭“数据传送连接”并结束运行
- 控制连接
- FTP连接建立过程
- 当客户进程向服务器进程发出建立连接请求时,要寻找连接服务器进程的熟知端口21,同时还要告诉服务器进程自己的另一个端口号码,用于建立数据传送连接。
- 接着,服务器进程用自己传送数据的熟知端口20与客户进程所提供的的端口号建立数据传送连接。
- 由于FTP使用了两个不同的端口号,所以数据连接与控制连接不会发生混乱。但这样做并非对所有的数据传输都是最佳的,如:
- 计算机A上运行的应用程序要在远地计算机B的一个很大的文件末尾添加一行信息。
- 若使用FTP则应先将此文件从B传送到A,添加上这行信息后,再传送回B。
- 实际上这种传送是不必要的,因为A并没有使用该文件的内容。
6.4 万维网WWW
一、万维网概述
- 万维网WWW(World Wide Web) 是一个大规模的、联机式的信息储藏所,英文简称是 Web。
- 万维网是分布式超媒体(hypermedia)系统,它是超文本(hypertext)系统的扩充
- 万维网必须解决以下几个问题
- 怎样标识分布在整个因特网上的万维网文档?
- 使用统一资源定位符 URL(Uniform Resource Locator) 来表示万维网上的各种文档,每个文档具有唯一的标识符。
- 用什么协议实现万维网上各种超链的链接?
- 超文本传送协议 HTTP(HyperText Transfer Protocol)
- 如何存储和表示万维网文档?
- 超文本标记语言 HTML(HyperText Markup Language)
- 怎样使用户能够很方便地找到所需的信息?
- 搜索引擎:Baidu,Google
- 怎样标识分布在整个因特网上的万维网文档?
二、统一资源定位符 URL
- URL是对Internet上资源位置和访问方法的一种简洁表示
- URL的一般形式
- <主机>为存放资源的主机在Internet中的域名
- <端口>和<路径>有时可省略。
- 使用http协议时,如省略<端口>,则使用熟知端口号80;如省略<路径>,则指主页(home page)
- URL不区分大小写
三、超文本传送协议 HTTP
1. HTTP的操作过程
- HTTP—HyperText Transfer Protocol
- HTTP使用了面向连接的TCP作为运输层协议,保证了数据的可靠传输。
- HTTP是无状态的(stateless),即服务器不记录客户端的访问状态。
- 也就是说,同一个客户第二次访问同一个服务器上的页面时,服务器的响应与第一次被访问时是相同的,因为服务器并不记得曾经访问过这个客户。
- HTTP是面向事务的客户/服务器协议,鼠标点击超链接后发生的事件如下:
(1) 浏览器分析超链指向页面的 URL
(2) 浏览器向DNS请求解析 www.buaa.edu.cn的IP地址
(3) 域名系统DNS解析出北航Web服务器的IP地址
(4) 浏览器与服务器建立TCP连接
(5) 浏览器发出取文件命令:GET /chn/yxsz/index.htm
(6) 服务器给出响应,把文件index.html发给浏览器
(7) TCP 连接释放
(8) 浏览器显示“北航概况”文件index.html中的所有文本
- HTTP的基本工作原理
- Web服务的熟知端口号是80,服务器通常在该端口上监听
- 客户端需要请求某个页面时,与服务器建立TCP链接,之后请求传送文件,并进行文件的传送,传送完毕后释放TCP连接
- 请求一个万维网文档所需的时间
- 首先建立TCP连接,需3次握手
- 在2次握手后,第3次握手报文的数据部分可传送HTTP请求报文
- 请求文档所需时间 = 文档传输时间 + 2倍RTT时间
HTTP/1.0的主要缺点
- 每请求一个文档都需要建立一次TCP连接,而一个Web页面常常包含数量众多的文件
HTTP/1.1协议使用持续连接(persistent connection)
- 服务器发送响应后,在一段时间内保持连接,使客户与服务器可以继续传送后续的HTTP请求报文和响应报文
- 这并不局限于传送同一个页面上链接的文档,而是只要这些文档都在同一个服务器上就行
- 目前主流的浏览器都默认支持HTTP/1.1
HTTP/1.1协议的持续连接有两种工作方式,即非流水线方式(withoutpipelining)和流水线方式(with pipelining)
- 非流水线方式
- 特点是,客户在收到前一个响应后才能发出下一个请求。
- 因此,在TCP连接已建立后,客户每访问一次对象都要用去一个往返时间RTT。这比非持续连接节省了建立TCP连接所需的一个RTT时间。
- 但非流水线方式还是有缺点的,因为服务器在发送完一个对象后,其TCP连接就处于空闲状态,浪费了服务器资源。
- 流水线方式
- 特点是,客户在收到HTTP的响应报文之前就能够接着发送新的请求报文。
- 于是一个接一个的请求报文到达服务器后,服务器就可连续发回响应报文。
- 因此,使用流水线方式时,客户访问所有的对象只需花费一个RTT时间。
- 流水线工作方式使TCP连接中的空闲时间减少,提高了下载文档效率。
- 非流水线方式
2. 代理服务器(了解)
- 代理服务器(proxy server)是一种网络实体,它又称为万维网高速缓存(Web cache)
- 代理服务器把最近的一些请求和响应暂存在本地磁盘中。
- 当新请求到达时,若代理服务器发现这个请求与暂时存放的请求相同,就返回暂存的响应,而不需要按URL的地址再次去互联网访问该资源。
- 代理服务器可在客户端或服务器端工作,也可在中间系统上工作。
- 下图(a)是是校园网不使用代理服务器的情况。
- 这时,校园网中所有的计算机都通过2Mbit/s专线链路(R1-R2)与互联网上的源点服务器建立TCP连接。
- 因而校园网各计算机访问互联网的通信量往往会使这条2 Mbit/s的链路过载,使得时延大大增加。
- 图(b)是校园网使用代理服务器的情况。这时,访问互联网的过程是这样的:
(1) 校园网的计算机中的浏览器向互联网的服务器请求服务时,就先和校园网的代理服务器建立TCP连接,并向代理服务器发出HTTP请求报文。
(2) 若代理服务器己经存放了所请求的对象,代理服务器就把这个对象放入HTTP响应报文中返回给计算机的浏览器。
(3) 否则,代理服务器就代表发出请求的用户浏览器,与互联网上的源点服务器(origin server)建立TCP连接,并发送HTTP请求报文。
(4) 源点服务器把所请求的对象放在HTTP响应报文中返回给校园网的代理服务器。
(5) 代理服务器收到这个对象后,先复制在自己的本地存储器中(留待以后用),然后再把这个对象放在HTTP响应报文中,通过己建立的TCP连接,返回给请求该对象的浏览器。
3. HTTP的报文结构
- HTTP有两类报文:
- 请求报文——从客户向服务器发送请求报文
- 响应报文——从服务器到客户的回答
- HTTP是面向文本的(text-oriented),报文中的字段都是ASCII 码串,因而每个字段的长度都是不确定的。
- 可以看出,HTTP请求报文和响应报文都是由三个部分组成的,这两种报文格式的区别就是开始行不同。
- 开始行
- 用于区分是请求报文还是响应报文。
- 在请求报文中的开始行叫做请求行(Request-Line),而在响应报文中的开始行叫做状态行(Status-Line)。
- 在开始行的三个字段之间都以空格分隔开
- 最后的“CR”和“LF”分别代表“回车”和“换行”。
- 首部行
- 用来说明浏览器、服务器或报文主体的一些信息。
- 首部可以有好几行,但也可以不使用。在每一个首部行中都有首部字段名和它的值,每一行在结束的地方都要有“回车”和“换行”。
- 整个首部行结束时,还有一空行将首部行和后面的实体主体分开。
- 实体主体(entity body)
- 在请求报文中一般都不用这个字段,而在响应报文中也可能没有这个字段。
- 开始行
HTTP请求报文
- 请求报文的第一行“请求行”只有三个内容,即方法,请求资源的URL,以及HTTP的版本。
- 下面是一个完整的HTTP请求报文的例子
- 在请求行使用了相对URL (即省略了主机的域名)是因为下面的首部行(第2行)给出了主机的域名。
- 第3行是告诉服务器不使用持续连接,表示浏览器希望服务器在传送完所请求的对象后即关闭TCP连接。
- 这个请求报文没有实体主体。
HTTP响应报文
每一个请求报文发出后,都能收到一个响应报文。响应报文的第一行就是状态行。
状态行包括三项内容,即HTTP的版本,状态码,以及解释状态码的简单短语。
状态码(Status-Code)都是三位数字的,分为5大类:
- 1xx表示通知信息,如请求收到了或正在进行处理。
- 2xx表示成功,如接受或知道了。
- 3xx表示重定向,如要完成请求还必须釆取进一步的行动。
- 4xx表示客户的差错,如请求中有错误的语法或不能完成。
- 5xx表示服务器的差错,如服务器失效无法完成请求。
下面三种状态行在响应报文中是经常见到的。
4. 在服务器上存放用户的信息(了解)
在前面已经介绍过,HTTP是无状态的。这样做虽然简化了服务器的设计,但在实际工作中,一些万维网站点却常常希望能够识别用户。
- 例如,在网上购物时,一个顾客要购买多种物品。当他把选好的一件物品放入“购物车”后,他还要继续浏览和选购其他物品。因此,服务器需要记住用户的身份,使他接着选购的一些物品能够放入同一个“购物车”中,这样就便于集中结账。
- 有时某些万维网站点也可能想限制某些用户的访问。
要做到这点,可以在HTTP中使用Cookie。
- 在RFC 6265中对Cookie进行了定义,规定万维网站点可以使用Cookie来跟踪用户,目前尚无标准译名。
Cookie 的工作过程。
- 当用户A浏览某个使用Cookie的网站时,该网站的服务器就为A产生一个唯一的识别码,并以此作为索引在服务器的后端数据库中产生一个项目。
- 接着在给A的HTTP响应报文中添加一个叫做Set-cookie的首部行,例如:
Set-cookie: 31d4d96e407aad42
- 这里的“首部字段名”就是“Set-cookie”,而后面的“值”就是赋予该用户的“识别码”。
- 当A收到这个响应时,其浏览器就在它管理的特定Cookie文件中添加一行,其中包括这个服务器的主机名和Set-cookie后面给出的识别码。
- 当A继续浏览这个网站时,每发送一个HTTP请求报文,其浏览器就会从其Cookie文件中取出这个网站的识别码,并放到HTTP请求报文的Cookie首部行中:
Cookie: 31d4d96e407aad42
- 于是,这个网站就能够跟踪用户31d4d96e407aad42 (用户A)在该网站的活动。
需要注意的是:
- 服务器并不需要知道这个用户的真实姓名以及其他的信息。
- 但服务器能够知道用户31d4d96e407aad42在什么时间访问了哪些页面,以及访问这些页面的顺序。
- 如果A是在网上购物,那么这个服务器可以为A维护一个所购物品的列表,使A在结束这次购物时可以一起付费。
四、万维网的文档
超文本标记语言HTML (HyperText Markup Language)是一种制作万维网页面的标准语言,它消除了不同计算机之间信息交流的障碍。
- 注意,HTML并不是应用层的协议,它只是万维网浏览器使用的一种语言。
HTML定义了许多用于排版的命令,即标签(tag)
- 如:<I> 表示后面开始用斜体排版,</I> 表示斜体结束
HTML把各种标签嵌入到万维网的页面中,构成 HTML 文档
- HTML文档是一种可以用任何文本编辑器(例如,Windows的记事本Notepad)创建的ASCII码文件。
- 仅当 HTML 文档是以.html 或 .htm 为后缀时,浏览器才对此文档的各种标签进行解释
浏览器从服务器读取 HTML文档后,按照其中嵌入的各种标签,根据显示器尺寸和分辨率显示页面
与浏览器有关的几种其他语言(了解)
XML
- XML (Extensible Markup Language)是可扩展标记语言,它和HTML很相似。但XML的设计宗旨是传输数据,而不是显示数据(HTML是为了在浏览器上显示数据)。
- 更具体些,XML用于标记电子文件,使其具有结构性的标记语言,可用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
- XML是一种简单、与平台无关并被广泛釆用的标准。XML相对于HTML的优点是它将用户界面与结构化数据分隔开来。这种数据与显示的分离使得集成来自不同源的数据成为可能。
- 客户信息、订单、研究结果、账单付款、病历、目录数据及其他信息都可以转换为XML。
- XML不是要替换HTML,而是对HTML的补充。
- XML标记由文档的作者定义,并且是无限制的。HTML标记则是预定义的;HTML作者只能使用当前HTML标准所支持的标记。
XHTML
- 另一种语言XHTML (Extensible HTML)是可扩展超文本标记语言,它与HTML 4.01几乎是相同的。
- 但XHTML是更严格的HTML版本,也是一个W3C标准(2000年1月制定),是作为一种XML应用被重新定义的HTML,并将逐渐取代HTML。
- 所有新的浏览器都支持XHTML。
CSS
- 还有一种语言CSS (Cascading Style Sheets)是层叠样式表,它是一种样式表语言,用于为HTML文档定义布局。
- CSS与HTML的区别就是:HTML用于结构化内容,而CSS则用于格式化结构化的内容。
- 例如,在浏览器上显示的字体、颜色、边距、高度、宽度、背景图像等方面,都能够给出精确的规定。现在所有的浏览器都支持CSS。
五、安全的HTTP协议:HTTPS
- HTTPS:安全的HTTP协议,建立在SSL基础上
- SSL/TLS已被浏览器广泛支持,很多Web应用利用HTTPS协议实现安全传输
- HTTPS的熟知端口号为443,而不是80
- SSL简介
- Secure Socket Layer,为TCP协议提供信息加密和完整性
- Netscape于1994年开发,1996年发布 SSL 3.0,1999年IETF 在 SSL 3.0 基础上推出了TLS (Transport Layer Security)
6.5 电子邮件
一、电子邮件概述
- 电子邮件的两个最重要的标准就是:简单邮件传送协议SMTP (Simple Mail Transfer Protocol)[RFC 5321]和互联网文本报文格式 (Internet Message Format)[RFC 5322]。
- 由于互联网的SMTP只能传送可打印的7位ASCI码邮件,因此在1993年又提出了通用互联网邮件扩充MIME (Multipurpose Internet Mail Extensions)。
- MIME在其邮件首部中说明了邮件的数据类型(如文本、声音、图像、视像等)。
- 在MIME邮件中可同时传送多种类型的数据。这在多媒体通信的环境下是非常有用的。
- 读取邮件的协议:
- POP3—Post Office Protocol
- IMAP—Internet Message Access Protocol
- 一个电子邮件系统应具有下图所示的三个主要组成构件:
- 这就是用户代理、邮件服务器,以及邮件发送协议(如SMTP)和邮件读取协议(如POP3)。
- 电子邮件系统的两种实体:
- 用户代理UA(User Agent)
- 是用户与电子邮件系统的接口,即电子邮件客户端软件
- 用户代理至少应该具备四个功能:撰写、显示、处理和通信
- 邮件服务器
- 用于发送和接收邮件,并向发信人报告传送结果(已交付、被拒绝、丢失等)
- 邮件服务器按照客户/服务器方式工作
- 邮件服务器需要使用两种不同的协议。一种协议用于用户代理向邮件服务器发送邮件或在邮件服务器之间发送邮件,如SMTP协议,而另一种协议用于用户代理从邮件服务器读取邮件,如邮局协议POP3。
- 这里应当注意,邮件服务器必须能够同时充当客户和服务器。
- 例如,当邮件服务器A向另一个邮件服务器B发送邮件时,A就作为SMTP客户,而B是SMTP服务器。反之,当B向A发送邮件时,B就是SMTP客户,而A就是SMTP服务器。
- 请注意,SMTP和POP3 (或IMAP)都是使用TCP连接来传送邮件的,使用TCP的目的是为了可靠地传送邮件。
- 用户代理UA(User Agent)
计算机之间发送和接收电子邮件的几个重要步骤(了解)
(1)发件人调用计算机中的用户代理撰写和编辑要发送的邮件。
(2)发件人点击屏幕上的“发送邮件”按钮,把发送邮件的工作全都交给用户代理来完成。用户代理把邮件用SMTP协议发给发送方邮件服务器,用户代理充当SMTP客户,而发送方邮件服务器充当SMTP服务器。
用户代理所进行的这些工作,用户是看不到的。有的用户代理可以让用户在屏幕上看见邮件发送的进度显示。用户所使用的邮件服务器究竟在什么地方,用户并不知道,也不必要知道。实际上,用户在把写好的信件交付给用户代理后,就什么都不用管了。
(3)SMTP服务器收到用户代理发来的邮件后,就把邮件临时存放在邮件缓存队列中,等待发送到接收方的邮件服务器
等待时间的长短取决于邮件服务器的处理能力和队列中待发送的信件的数量。但这种等待时间一般都远远大于分组在路由器中等待转发的排队时间。
(4)发送方邮件服务器的SMTP客户与接收方邮件服务器的SMTP服务器建立TCP连接,然后就把邮件缓存队列中的邮件依次发送出去。
请注意,邮件不会在互联网中的某个中间邮件服务器落地。
如果SMTP客户还有一些邮件要发送到同一个邮件服务器,那么可以在原来已建立的TCP连接上重复发送。
如果SMTP客户无法和SMTP服务器建立TCP连接(例如,接收方服务器过负荷或出了故障),那么要发送的邮件就会继续保存在发送方的邮件服务器中,并在稍后一段时间再进行新的尝试。
如果SMTP客户超过了规定的时间还不能把邮件发送出去,那么发送邮件服务器就把这种情况通知用户代理。
(5)运行在接收方邮件服务器中的SMTP服务器进程收到邮件后,把邮件放入收件人的用户邮箱中,等待收件人进行读取。
(6)收件人在打算收信时,就运行计算机中的用户代理,使用POP3 (或IMAP)协议读取发送给自己的邮件。
请注意,在上图中,POP3服务器和POP3客户之间的箭头表示的是邮件传送的方向。但它们之间的通信是由POP3客户发起的。
二、简单邮件传送协议 SMTP
- 简介
- SMTP规定了两个相互通信的SMTP进程之间应如何交换信息
- SMTP使用客户/服务器方式
- 负责发送邮件的SMTP进程就是SMTP 客户
- 负责接收邮件的SMTP进程就是SMTP服务器
- SMTP定义了14条命令和21种应答信息
- 每条命令用4个字母组成
- 每一种应答信息一般只有一行信息,由一个3位数字的代码开始,后面附上(也可不附上)简单的文字说明
- SMTP通信的三个阶段
- 连接建立:连接在发送主机的SMTP客户和接收主机的SMTP服务器之间建立,不使用中间邮件服务器
- 邮件传送
- 连接释放:邮件发送完毕后,SMTP释放 TCP 连接
三、邮件读取协议 POP3 和 IMAP(了解)
POP3
- 邮局协议 POP 是一个非常简单、但功能有限的邮件读取协议,目前为POP3版本。
- POP3也使用客户服务器的工作方式。
- 在接收邮件的用户计算机中的用户代理必须运行POP3客户程序,而在收件人所连接的ISP的邮件服务器中则运行POP3服务器程序。
- 当然,这个ISP的邮件服务器还必须运行SMTP服务器程序,以便接收发送方邮件服务器的SMTP客户程序发来的邮件。
- POP3服务器只有在用户输入鉴别信息(用户名和口令)后,才允许对邮箱进行读取。
- POP3协议的一个特点就是只要用户从POP3服务器读取了邮件,POP3服务器就把该邮件删除。
- 这在某些情况下就不够方便。例如,某用户在办公室的台式计算机上接收了一个邮件,还来不及写回信,就马上携带笔记本电脑出差。当他打开笔记本电脑写回信时,POP3服务器上却己经删除了原来巳经看过的邮件。
- 为了解决这一问题,POP3进行了一些功能扩充,其中包括让用户能够事先设置邮件读取后仍然在POP3服务器中存放的时间。
IMAP
- 另一个读取邮件的协议是网际报文存取协议IMAP。
- IMAP和POP都按客户服务器方式工作,但它们有很大的差别。
- 在使用IMAP时,在用户的计算机上运行IMAP客户程序,然后与接收方的邮件服务器上的IMAP服务器程序建立TCP连接。用户在自己的计算机上就可以操纵邮件服务器的邮箱,就像在本地操纵一样,因此IMAP是一个联机协议。
- 当用户计算机上的IMAP客户程序打开IMAP服务器的邮箱时,用户就可看到邮件的首部。若用户需要打开某个邮件,则该邮件才传到用户的计算机上。
- 用户可以根据需要为自己的邮箱创建便于分类管理的层次式的邮箱文件夹,并且能够将存放的邮件从某一个文件夹中移动到另一个文件夹中。
- 用户也可按某种条件对邮件进行査找。在用户未发出删除邮件的命令之前,IMAP服务器邮箱中的邮件一直保存着。
- IMAP的好处
- 用户可以在不同的地方使用不同的计算机随时上网阅读和处理自己在邮件服务器中的邮件。
- IMAP还允许收件人只读取邮件中的某一个部分。
- 例如,收到了一个带有视像附件(此文件可能很大)的邮件,而用户使用的是无线上网,信道的传输速率很低。为了节省时间,可以先下载邮件的正文部分,待以后有时间再读取或下载这个很大的附件。
- IMAP的缺点
- 如果用户没有将邮件复制到自己的计算机上,则邮件一直存放在IMAP服务器上。要想査阅自己的邮件,必须先上网。
四、电子邮件的信息格式
- RFC 2822(RFC 822):Internet Message Format
- 一个电子邮件分为信封和内容两大部分
- RFC 822只规定了邮件内容中的首部(header)格式,而对邮件的主体(body)部分则由用户自由撰写
- 首部中的主要字段
- To:后面填入一个或多个收件人的e-mail地址
- Subject:邮件的主题,反映了邮件的主要内容
- Cc:抄送(Carbon copy),表示给某人发送一个邮件副本
- From:发信人的电子邮件地址
- Date:发信日期
- Reply-to:对方回信地址
五、通用互联网邮件扩充 MIME
SMTP的问题
- SMTP不能传送可执行文件或其他的二进制对象。
- SMTP限于传送7位的ASCII码。许多其他非英语国家的文字(如中文、俄文,甚至带重音符号的法文或德文)就无法传送。
- SMTP服务器会拒绝超过一定长度的邮件。
- 某些SMTP的实现并没有完全按照SMTP的互联网标准。常见的问题如下:
- 回车、换行的删除和増加;
- 超过76个字符时的处理:截断或自动换行;
- 后面多余空格的删除;
- 将制表符tab转换为若干个空格。
在这种情况下提岀了通用互联网邮件扩充 MIME (Multi-purpose Internet Mail Extension) [RFC 2045 ~ 2049] ,其基本思路为:
- 继续使用目前的[RFC 822]格式
- 对二进制数据进行编码,将其转换为7位ASCII码
- 邮件首部中增加字段,定义数据类型和编码规则
MIME 新增了5种头部字段
- 传输编码规则:
- base64: 又称为Radix-64 (基数64转换),原始二进制数据中的每6bit被映射为8bit(ASCII字符)
- quoted-printable: 原始二进制数据的8bit表示为2个16进制数,前加“=”